using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Targeting : MonoBehaviour {
	public List<Transform> targets;
	public Transform selectedTarget;
	
	private Transform myTransform;
	
	// Use this for initialization
	void Start () {
		targets = new List<Transform>();
		selectedTarget = null;
		myTransform = transform;
		AddAllEnemies();
	}
	
	public void AddAllEnemies()
	{
		GameObject[] go = GameObject.FindGameObjectsWithTag("Enemy");
		
		foreach(GameObject enemy in go)
			AddTarget(enemy.transform);
	}
	
	public void AddTarget(Transform enemy)
	{
		targets.Add(enemy);
	}
	
	private void SortTargetsByDistance()
	{
		for(int i = 0; i < targets.Count; ++i)
		{
			if(targets[i] == null)
			{
				targets.RemoveAt(i);
			}
		}
		targets.Sort(delegate(Transform t1, Transform t2) {
		return Vector3.Distance(t1.position, myTransform.position).CompareTo(Vector3.Distance(t2.position, myTransform.position));
		});
	}
	
	private void TargetEnemy()
	{
		if(selectedTarget == null)
		{
			SortTargetsByDistance();
			selectedTarget = targets[0];
		}
		else
		{
			int index = targets.IndexOf(selectedTarget);
			
			if(index < targets.Count - 1)
			{
				index++;
			}
			else
			{
				index = 0;	
			}
			DeselectTarget();
			selectedTarget = targets[index];
		}
		SelectTarget();

	}
	
	private void SelectTarget()
	{	
		if(selectedTarget != null)
		{
			selectedTarget.renderer.material.color = Color.red;
		
			PlayerAttack pa = (PlayerAttack)GetComponent("PlayerAttack");
			pa.target = selectedTarget.gameObject;
		
			EnemyHealth eh = (EnemyHealth)selectedTarget.GetComponent("EnemyHealth");
			eh.AdjustShowHealth(true);
		}
	}
	
	public void DeselectTarget()
	{
		if(selectedTarget != null)
		{
			selectedTarget.renderer.material.color = Color.grey;
			EnemyHealth eh = (EnemyHealth)selectedTarget.GetComponent("EnemyHealth");
			eh.AdjustShowHealth(false);
			selectedTarget = null;
		}
	}
	
	// Update is called once per frame
	void Update () {
		if(Input.GetKeyDown(KeyCode.Tab))
		{
			TargetEnemy();
		}
		if(Input.GetMouseButtonDown(0))
		{
			DeselectTarget();
			MouseSelect();
		}
	
	}
	
	private void MouseSelect()
	{
		RaycastHit hit = new RaycastHit();
		
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray,out hit))
		{
			GameObject[] go = GameObject.FindGameObjectsWithTag("Enemy");
		
			foreach(GameObject enemy in go)
			{
				if((hit.collider.name ==  enemy.name))
				{
					selectedTarget = enemy.transform;
					selectedTarget.renderer.material.color = Color.red;
					
					PlayerAttack pa = (PlayerAttack)GetComponent("PlayerAttack");
					pa.target = selectedTarget.gameObject;
		
					EnemyHealth eh = (EnemyHealth)selectedTarget.GetComponent("EnemyHealth");
					eh.AdjustShowHealth(true);
				}
			}
			
		}
	}
}
